// 测试脚本：全面测试订单相关功能
const { pool } = require('./config/db');
const { createOrder, getOrderById, getUserOrders, updateOrderStatus, deleteOrder } = require('./models/order');

// 测试函数
async function testOrderFunctions() {
  try {
    console.log('=================== 开始测试订单功能 ===================\n');
    
    // 1. 测试数据库连接
    console.log('1. 测试数据库连接...');
    await pool.getConnection()
      .then(connection => {
        console.log('   ✓ 数据库连接成功');
        connection.release();
      });
    
    // 2. 检查是否有测试用户，如果没有则创建一个
    console.log('\n2. 检查测试用户...');
    let testUserId;
    const [users] = await pool.execute('SELECT id FROM users LIMIT 1');
    
    if (users.length > 0) {
      testUserId = users[0].id;
      console.log(`   ✓ 找到测试用户，ID: ${testUserId}`);
    } else {
      // 创建一个测试用户
      const [result] = await pool.execute(
        "INSERT INTO users (openid, nickname, avatar, created_at) VALUES ('test_openid', '测试用户', '/avatar.jpg', NOW())"
      );
      testUserId = result.insertId;
      console.log(`   ✓ 创建测试用户成功，ID: ${testUserId}`);
    }
    
    // 3. 检查是否有测试商品，如果没有则创建一个
    console.log('\n3. 检查测试商品...');
    let testGoodsId;
    const [goods] = await pool.execute('SELECT id, price, title FROM goods LIMIT 1');
    
    if (goods.length > 0) {
      testGoodsId = goods[0].id;
      console.log(`   ✓ 找到测试商品，ID: ${testGoodsId}，名称: ${goods[0].title}`);
    } else {
      // 创建一个测试商品
      const [result] = await pool.execute(
        "INSERT INTO goods (title, description, price, image) VALUES ('测试商品', '这是一个测试商品', 99.99, '/goods.jpg')"
      );
      testGoodsId = result.insertId;
      console.log(`   ✓ 创建测试商品成功，ID: ${testGoodsId}`);
    }
    
    // 4. 测试创建订单
    console.log('\n4. 测试创建订单...');
    const orderData = {
      user_id: testUserId,
      goods_id: testGoodsId,
      goods_info: { title: '测试商品', price: 99.99, quantity: 1 },
      total_price: 99.99
    };
    
    const order = await createOrder(orderData);
    console.log(`   ✓ 创建订单成功，订单ID: ${order.id}`);
    
    // 5. 测试获取订单详情
    console.log('\n5. 测试获取订单详情...');
    const orderDetail = await getOrderById(order.id);
    console.log(`   ✓ 获取订单详情成功`);
    console.log(`   ✓ 订单状态: ${orderDetail.status}`);
    
    // 6. 测试获取用户订单列表
    console.log('\n6. 测试获取用户订单列表...');
    const userOrders = await getUserOrders(testUserId);
    console.log(`   ✓ 获取用户订单列表成功，共 ${userOrders.length} 个订单`);
    
    // 7. 测试更新订单状态
    console.log('\n7. 测试更新订单状态...');
    await updateOrderStatus(order.id, '已支付');
    const updatedOrder = await getOrderById(order.id);
    console.log(`   ✓ 更新订单状态成功，新状态: ${updatedOrder.status}`);
    
    // 8. 测试删除订单（可选，如果需要保留测试数据可以注释掉）
    console.log('\n8. 测试删除订单...');
    await deleteOrder(order.id);
    const deletedOrder = await getOrderById(order.id);
    console.log(`   ✓ 删除订单成功，查询结果: ${deletedOrder ? '存在' : '不存在'}`);
    
    console.log('\n=================== 订单功能测试全部通过 ===================');
    
  } catch (error) {
    console.error('\n❌ 订单功能测试失败:', error);
    console.error('错误详情:', error.stack);
    
    // 检查是否是SQL参数问题
    if (error.code === 'ER_WRONG_ARGUMENTS' || error.code === 'ER_NO_REFERENCED_ROW_2') {
      console.error('\n这表明可能存在SQL参数化查询问题或外键约束问题，需要进一步检查。');
    }
  } finally {
    // 关闭数据库连接
    console.log('\n关闭数据库连接...');
    await pool.end();
  }
}

// 执行测试
testOrderFunctions();